package com.wonders.app.file.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.wonders.app.bean.CenterBean;
import com.wonders.app.bean.NodeBean;
import com.wonders.app.file.service.impl.NodeServiceImpl;
import com.wonders.app.utils.ConfigPathUtil;
import com.wonders.common.exception.RRException;
import com.wonders.common.utils.R;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.util.*;


@RestController
@RequestMapping("/node")
public class NodeController {

    private static final Logger logger =
            LoggerFactory.getLogger(NodeController.class);

    @Autowired
    NodeServiceImpl nodeService;

    @Autowired
    ConfigPathUtil configPathUtil ;


    //所有的目录结构信息
    @RequestMapping("/listAll")
    public R listNodes(@RequestBody NodeBean nodeBean) {

        List<NodeBean> nodeBeans = nodeService.selectNodes(nodeBean);
        Map<String, Object> map = new HashMap<>();
        map.put("result", nodeBeans);
        return R.ok(map);
    }

    //所有pid 的子列表
    @RequestMapping("/getCenters")
    public R getCenters(@RequestBody NodeBean nodeBean) {
        System.out.println("获取配置信息 "+configPathUtil.getRootPath());

        List<NodeBean> nodeBeans = nodeService.getCenters(nodeBean);
        Map<String, Object> map = new HashMap<>();
        map.put("result", nodeBeans);
        return R.ok(map);
    }


    //修改一条数据
    @RequestMapping("/updateById")
    public R updateById(@RequestBody NodeBean nodeBean) {
        Boolean aBoolean = nodeService.upDateOneDataById(nodeBean);
        Map<String, Object> map = new HashMap<>();
        map.put("result", aBoolean);
        return R.ok(map);
    }


    //获取一条数据
    @RequestMapping("/getOneData")
    public R getOneData (@RequestBody NodeBean nodeBean) {
        NodeBean node = nodeService.getOneData(nodeBean);
        Map<String, Object> map = new HashMap<>();
        map.put("result", node);
        return R.ok(map);
    }

    //删除数据
    @RequestMapping("/deleteById")
    public R deleteById(@RequestBody NodeBean nodeBean) {
        Boolean aBoolean = nodeService.deleteOneDataById(nodeBean);
        Map<String, Object> map = new HashMap<>();
        map.put("result", aBoolean);
        return R.ok(map);
    }




    //保存到数据库-> 文件的信息
    @RequestMapping("/saveOneData")
    public R saveOneData(@RequestBody NodeBean nodeBean) {
        System.out.println(nodeBean.toString());
        //普通文件
        nodeBean.setType("f");
        Boolean aBoolean = nodeService.insertOneData(nodeBean);
        Map<String, Object> map = new HashMap<>();
        map.put("result", aBoolean);
        return R.ok(map);
    }


    /**
     *  能力和中心，有logo
     * @RequestParam("id") long id,@RequestParam("des") String des,
     *                              @RequestParam("name") String name,
     * @return
     */
    @RequestMapping("/saveSpecialData")
    public R saveSpecialData(@RequestParam("pid") long pid, @RequestParam("des") String des,
                             @RequestParam("name") String name, @RequestParam("kind") String kind,
                             @RequestParam(value = "file",required =false ) MultipartFile file) {
       if (file!=null){
           logger.error("文件  "+file.toString()+"大小"+file.getSize()+"名字"+file.getOriginalFilename());
       }

        R r = new R();
        Boolean save = true;
        NodeBean nodeBean = new NodeBean();
        nodeBean.setpId(pid);
        nodeBean.setName(name);
        nodeBean.setKind(kind);
        nodeBean.setDes(des);
        System.out.println(nodeBean.toString());
        Boolean aBoolean = nodeService.insertOneData(nodeBean);
        Map<String, Object> map = new HashMap<>();
        // todo 如果 nodeBean的父id是0，说明是中心，那么就创建默认的3种情况（基本信息，一般接入文档，常见问题）
        if (nodeBean.getpId() == 0) {
            QueryWrapper queryWrapper = new QueryWrapper();
            // 暂时是用名称定为的新创建的中心
            queryWrapper.eq("name", nodeBean.getName());
            NodeBean one = nodeService.getOne(queryWrapper);

            NodeBean node = new NodeBean();
            node.setName("中心信息");
            node.setType("ci");
            node.setpId(one.getId());

            NodeBean node1 = new NodeBean();
            node1.setName("能力列表");
            node1.setType("al");
            node1.setpId(one.getId());

            nodeService.save(node);
            nodeService.save(node1);
            if(file!=null&&file.getSize()>0){
                r = nodeService.upload(file, one.getId());
            }
//            map.put("result", aBoolean && save);

        } else if (nodeBean.getKind() != null && nodeBean.getKind().equals("nor")) {
            System.out.println("创建能力");
            QueryWrapper queryWrapper = new QueryWrapper();
            // 暂时是用名称定为的新创建的中心- 中心的名字-> 中心下创建两个默认东西
            queryWrapper.eq("name", nodeBean.getName());
            queryWrapper.eq("p_id", nodeBean.getpId());
            NodeBean one = nodeService.getOne(queryWrapper);

            //为了后期扩展修改，没有写一块
            //说明需要创建基本信息
//            NodeBean node = new NodeBean();
//            node.setName("基本信息");
//            node.setpId(one.getId());

            NodeBean node1 = new NodeBean();
            node1.setName("接入文档");
            node1.setpId(one.getId());
            //和父节点保持一致
            node1.setType("al");

            NodeBean node3 = new NodeBean();
            node3.setName("常见问题");
            node3.setpId(one.getId());
            node3.setType("al");

//            save =  nodeService.save(node1) && nodeService.save(node3);
//            nodeService.save(node);
            nodeService.save(node1);
            nodeService.save(node3);
            if (file!=null&&file.getSize()>0){
                r = nodeService.upload(file, one.getId());
            }

//            map.put("result", aBoolean && save);
        }
//        return R.ok(map);
        return r;
    }





    //上传文件
    //生成文件名的时候，拼接个
    @RequestMapping("/uploadFile")
    public R uploadFile(@RequestParam("file") MultipartFile file, @RequestParam("id") long id) {
        if (file.isEmpty()) {
            throw new RRException("上传文件不能为空");
        }
        return nodeService.upload(file, id);
    }


    /**
     * 下载文件
     * @param response 乱码解决
     * @return
     */
    @RequestMapping("/fileDownload2")
    public @ResponseBody
    R fileDownload2(@RequestBody NodeBean nodeBean, HttpServletResponse response) { //读出文件，返回文件流，下载
        System.out.println("下载文件2");
        nodeService.downloadStream2(nodeBean.getName(), response);
        Map<String, Object> map = new HashMap<>();
        map.put("result", "true");
        return R.ok(map);
    }

    /**
     * 下载文件 到文件夹
     *
     * 分两层，第一 中心一级的数据
     *        第二：中心的信息（包含所有的字信息）
     */
    @RequestMapping("/dataExport")
    public @ResponseBody
    R fileDownloadToTemp(@RequestBody CenterBean centerBean ) {

        System.out.println("下载文件到文件夹"+centerBean.toString());
        nodeService.clearDir("/temp/");
        nodeService.clearDir("/data/docker/nginx/html/zip/");
//        List<NodeBean> list = nodeService.downloadToTemp(nodeBean.getId());

        //所有的中心信息
        NodeBean nodeBean = new NodeBean();
        nodeBean.setpId((long) 0);

        //获取所有的中心信息，然后删除掉没有选中的
        List<NodeBean> list = nodeService.selectNodes(nodeBean);
        Iterator<NodeBean> iterator = list.iterator();
        while (iterator.hasNext()) {
            NodeBean next = iterator.next();//必须在remove()之前，显式调用next()
            List<String> ids = centerBean.getIds();
            Long id = next.getId();
            if (!ids.contains(String.valueOf(id))){
                iterator.remove();
            }
        }

        //下载
        List<String> ids = centerBean.getIds();
        for (String id:ids) {
            nodeService.downloadToTemp(Long.valueOf(id));
        }


        Map<String, Object> map = new HashMap<>();
        map.put("result",list );
        return R.ok(map);
    }







    //所有的目录结构信息-> 对数据过滤之类
//    @RequestMapping("/dealData")
//    public R listFiles(@RequestBody NodeBean nodeBean) {
//        //存放常见问题
//        List<NodeBean>  nodeBeanListO  = new ArrayList<>();
//
//        //传入的是中心的id。需要整合数据，修改成前端方便展示的样子，奇葩...
//        List<NodeBean> nodeBeans = nodeService.selectNodes(nodeBean);
//        List<NodeBean> indexList = new ArrayList<>();
//        System.out.println("一级循环长度"+nodeBeans.size());
//        List<NodeBean> nodeBeans2 = nodeService.selectNodes(nodeBean);
//        //整合返回的数据
//        for (int i = 0; i < nodeBeans.size(); i++) {
//            System.out.println("第一层的名字"+nodeBeans.get(i).getName());
//            if (nodeBeans.get(i).getName().equals("接入文档")) {
//                System.out.println("进来的  "+nodeBeans.get(i).getName());
//                //拿到的是能力列表
//                List<NodeBean> nodeBeanList = nodeBeans.get(i).getNodeBeanList();
//                int total = nodeBeanList.size() ;
//                nodeBeanListO = nodeBeans.get(i).getNodeBeanList();
//                System.out.println("有几个能力 " + nodeBeanList.size());
//                //遍历能力列表
//                for (int k = 0; k < total; k++){
//                    //某个能力下面的节点信息
//                    List<NodeBean> nodeBeanList1 = nodeBeanList.get(k).getNodeBeanList();
//                    System.out.println("修改前长度" + nodeBeanList1.size());
//                    System.out.println("某个能力下面有多少内容 " + nodeBeanList1.size());
//                    for (int j = 0; j < nodeBeanList1.size(); j++) {
//                        if (nodeBeanList1.get(j).getName().equals("基本信息")) {
//                            nodeBeanList1.remove(j);
//                        }
//                        if (nodeBeanList1.get(j).getName().equals("常见问题")) {
//                            nodeBeanList1.remove(j);
//                        }
//                    }
//                    System.out.println("修改后长度" + nodeBeanList1.size());
//                    //放入的是接入文档的下一级
//                    nodeBeanList.get(k).setNodeBeanList(nodeBeanList1);
//                }
//                //存放的是能力列表
//                nodeBeans.get(i).setNodeBeanList(nodeBeanList);
//            }else {
//                indexList.add(nodeBeans.get(i));
//            }
//        }
//
//        System.out.println("index "+indexList.size());
//        System.out.println(nodeBeans.size()+"nodeBeans"+nodeBeans.get(4).getName());
//
//        boolean b = nodeBeans.removeAll(indexList);
//        System.out.println("hha"+b);
////
//
//
//        System.out.println("最后的长度"+nodeBeans.size());
//        Map<String, Object> map = new HashMap<>();
//        map.put("result", nodeBeans2);
//        map.put("doc", nodeBeans);
////        map.put("question", nodeBeanListO);
//
//
//        return R.ok(map);
//    }



}
